AWSèªååã®åãè§£ãæŸã¡ãŸããããæ¬ã¬ã€ãã§ã¯ãBoto3ã®ã»ããã¢ãããåºæ¬æŠå¿µãS3ãEC2ãLambdaã®å®è·µäŸãã°ããŒãã«ããŒã åãã®ãã¹ããã©ã¯ãã£ã¹ãç¶²çŸ ããŠããŸãã
Pythonã§AWSããã¹ã¿ãŒããïŒã¯ã©ãŠããµãŒãã¹çµ±åã®ããã®Boto3 SDK詳现ã¬ã€ã
ã¯ã©ãŠãã³ã³ãã¥ãŒãã£ã³ã°ã®äžçã«ãããŠãAmazon Web Services (AWS) ã¯ãåºç¯ãã€çµ¶ããæ¡å€§ãããµãŒãã¹çŸ€ãæäŸããã°ããŒãã«ãªãŒããŒãšããŠåèšããŠããŸããéçºè ãDevOpsãšã³ãžãã¢ãã·ã¹ãã ã¢ãŒããã¯ãã«ãšã£ãŠããããã®ãµãŒãã¹ãããã°ã©ã ã§æäœããããšã¯ãåãªãå©äŸ¿æ§ã§ã¯ãªããå¿ èŠäžå¯æ¬ ãªãã®ã§ããã¹ã±ãŒã©ãã«ã§ã¬ãžãªãšã³ãããã€å¹ççãªã¯ã©ãŠãã€ã³ãã©ã¹ãã©ã¯ãã£ã管çããã«ã¯ãèªååãéµãšãªããŸããããã§ãPythonçšå ¬åŒAWS SDKã§ããBoto3ããããªãã®ããŒã«ã»ããã«äžå¯æ¬ ãªããŒã«ãšããŠç»å ŽããŸãã
ãã®å æ¬çãªã¬ã€ãã¯ãã°ããŒãã«ãªèªè ã察象ã«ãBoto3ãæ·±ãæãäžããŠè§£èª¬ããŸããåºç€ããå§ããäž»èŠãªAWSãµãŒãã¹ã®å®è·µäŸãéããŠãé«åºŠãªæŠå¿µãšãã¹ããã©ã¯ãã£ã¹ãæ¢æ±ããŸããç°¡åãªã¿ã¹ã¯ãèªååããå Žåã§ããè€éãªã¯ã©ãŠããã€ãã£ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããå Žåã§ããBoto3ãç¿åŸããããšã§ãAWSã®å¯èœæ§ãæå€§éã«åŒãåºãããšãã§ããã§ãããã
Boto3ãå§ããïŒAWSèªååãžã®ç¬¬äžæ©
ã³ãŒããæžãå§ããåã«ãå®å šã§æ©èœçãªéçºç°å¢ãã»ããã¢ããããå¿ èŠããããŸãããã®åæèšå®ã¯ãAWSãšã®é£æºãæåãããã€å®å šã§ããããšãä¿èšŒããããã«äžå¯æ¬ ã§ãã
ã°ããŒãã«ãªéçºç°å¢ã®åææ¡ä»¶
- Pythonã®ã€ã³ã¹ããŒã«ïŒ Boto3ã¯Pythonã©ã€ãã©ãªã§ãããããPythonãã€ã³ã¹ããŒã«ãããŠããå¿ èŠããããŸããBoto3ã¯å¹ åºãPythonããŒãžã§ã³ããµããŒãããŠããŸãããææ°ã®å®å®çPython 3ã䜿çšããããšããå§ãããŸããPythonã®ã¯ãã¹ãã©ãããã©ãŒã æ§ã¯ãäžçäžã«åæ£ããããŒã ã«ãšã£ãŠåªããéžæè¢ãšãªããŸãã
- AWSã¢ã«ãŠã³ãïŒ ãŸã ãæã¡ã§ãªãå Žåã¯ãAWSã¢ã«ãŠã³ãã«ãµã€ã³ã¢ããããå¿ èŠããããŸãããã®ããã»ã¹ã¯å ±éã§ãå€ãã®ãµãŒãã¹ã«ç¡ææ ã§ã¢ã¯ã»ã¹ã§ããåŠç¿ãå®éšã«æé©ã§ãã
- AWSãªãŒãžã§ã³ã®çè§£ïŒ AWSãµãŒãã¹ã¯ãäžçäžã®ããŒã¿ã»ã³ã¿ãŒã§ãã¹ããããŠãããå°ççãªãªãŒãžã§ã³ïŒäŸïŒ`us-east-1`ã`eu-west-2`ã`ap-southeast-1`ïŒã«çµç¹ãããŠããŸããé©åãªãªãŒãžã§ã³ãéžæããããšã¯ãã¬ã€ãã³ã·ãŒãããŒã¿äž»æš©ãã³ã¹ãã«ãšã£ãŠéåžžã«éèŠã§ããBoto3ã䜿çšããéã«ã¯ãæäœããããªãŒãžã§ã³ãæå®ããå¿ èŠãããããšããããããŸãã
ã€ã³ã¹ããŒã«ãšèšå®ïŒã»ãã¥ã¢ãªåºç€
åææ¡ä»¶ãæŽã£ãã®ã§ãBoto3ãã€ã³ã¹ããŒã«ããAWSã¢ã«ãŠã³ãã«å®å šã«æ¥ç¶ã§ããããã«èšå®ããŸãããã
1. Boto3ã®ã€ã³ã¹ããŒã«
ã€ã³ã¹ããŒã«ã¯ãPythonã®ããã±ãŒãžã€ã³ã¹ããŒã©ãŒã§ãã`pip`ã䜿çšããŠç°¡åã«è¡ããŸããã¿ãŒããã«ãŸãã¯ã³ãã³ãããã³ãããéãã以äžãå®è¡ããŠãã ããã
pip install boto3
2. AWSèªèšŒæ
å ±ãå®å
šã«èšå®ãã
ããã¯æãéèŠãªã¹ãããã§ãã AWSèªèšŒæ
å ±ïŒã¢ã¯ã»ã¹ããŒIDãšã·ãŒã¯ã¬ããã¢ã¯ã»ã¹ããŒïŒãã³ãŒãã«çŽæ¥ããŒãã³ãŒãããŠã¯ãããŸãããããã¯é倧ãªã»ãã¥ãªãã£ãªã¹ã¯ã§ããæšå¥šãããã¢ãããŒãã¯ãAWS Command Line Interface (CLI) ã䜿çšããŠãå®å
šãªå Žæã«ããããèšå®ããããšã§ãã
ãŸããAWS CLIãã€ã³ã¹ããŒã«ããŸãïŒãŸã ã€ã³ã¹ããŒã«ããŠããªãå ŽåïŒããã®åŸã以äžã®ã³ãã³ããå®è¡ããŸãã
aws configure
CLIã¯ã以äžã®4ã€ã®æ å ±ãå°ããŸãã
- AWS Access Key ID: ããªãã®ãŠããŒã¯ãªèå¥åã
- AWS Secret Access Key: ããªãã®ç§å¯ã®ãã¹ã¯ãŒããããã¯ä»ã®ãã¹ã¯ãŒããšåæ§ã«æ±ã£ãŠãã ããã
- Default region name: ã³ãŒããããã©ã«ãã§æ¥ç¶ããAWSãªãŒãžã§ã³ïŒäŸïŒ`us-west-2`ïŒã
- Default output format: éåžžã¯`json`ã
ãã®ã³ãã³ãã¯ãèªèšŒæ å ±ã`~/.aws/credentials`ã«ãããã©ã«ãã®ãªãŒãžã§ã³/åºå圢åŒã`~/.aws/config`ã«å®å šã«ä¿åããŸããBoto3ã¯ãããã®ãã¡ã€ã«ãèªåçã«åç §ãããããã¹ã¯ãªããå ã§èªèšŒæ å ±ãæå®ããå¿ èŠã¯ãããŸããããã®æ¹æ³ã«ãããæ©å¯æ§ã®é«ãããŒãã¢ããªã±ãŒã·ã§ã³ããžãã¯ããåé¢ããããããã³ãŒãã¯ããŒã¿ãã«ãã€ã»ãã¥ã¢ã«ãªããŸãã
Boto3ã®äž»èŠã³ã³ããŒãã³ãïŒã¯ã©ã€ã¢ã³ããšãªãœãŒã¹
Boto3ã«ã¯ãAWSãµãŒãã¹ãšå¯Ÿè©±ããããã®2ã€ã®ç°ãªãæ¹æ³ããããŸãããã¯ã©ã€ã¢ã³ãããšããªãœãŒã¹ããšããŠç¥ãããŠããŸãããã®éããçè§£ããããšã¯ã广çã§èªã¿ãããã³ãŒããæžãããã®éµãšãªããŸãã
2ã€ã®æœè±¡åãçè§£ãã
ãããã2ã€ã®ç°ãªãã¬ãã«ã®ã³ãã¥ãã±ãŒã·ã§ã³ãšããŠèããŠã¿ãŸãããã
- ã¯ã©ã€ã¢ã³ãïŒäœã¬ãã«ïŒïŒ åºç€ãšãªãAWSãµãŒãã¹APIæäœãžã®çŽæ¥çãª1察1ãããã³ã°ãæäŸããŸãããµãŒãã¹ã®å¯èœãªãã¹ãŠã®æäœã¯ããã®ã¯ã©ã€ã¢ã³ããä»ããŠå©çšã§ããŸããå¿çã¯éåžžãAPIããã®çJSONå¿çãšåæ§ã«ãèŸæžåœ¢åŒã§ãã
- ãªãœãŒã¹ïŒé«ã¬ãã«ïŒïŒ ããæœè±¡çãªãªããžã§ã¯ãæåã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããŸããåã«ã¡ãœãããåŒã³åºãã®ã§ã¯ãªãã屿§ãšã¢ã¯ã·ã§ã³ãæã€ããªãœãŒã¹ããªããžã§ã¯ããšå¯Ÿè©±ããŸããäŸãã°ãåå屿§ãš`delete()`ã¢ã¯ã·ã§ã³ãæã€`S3.Bucket`ãªããžã§ã¯ããæ±ãããšãã§ããŸãã
ã¯ã©ã€ã¢ã³ãAPIïŒäœã¬ãã«ã§çŽæ¥çãªãµãŒãã¹ã¢ã¯ã»ã¹
ã¯ã©ã€ã¢ã³ãã¯Boto3ã®åºç€ãšãªãã¬ã€ã€ãŒã§ãããµãŒãã¹APIå®çŸ©ãã¡ã€ã«ããçŽæ¥çæããããããåžžã«ææ°ãã€å®å šã§ããããšãä¿èšŒãããŸãã
ã¯ã©ã€ã¢ã³ãã䜿çšããå ŽåïŒ
- ãªãœãŒã¹APIã§ã¯å©çšã§ããªããµãŒãã¹æäœã«ã¢ã¯ã»ã¹ããå¿ èŠãããå Žåã
- èŸæžããŒã¹ã®å¿çãæ±ãããšã奜ãå Žåã
- APIåŒã³åºãã«å¯ŸããŠçµ¶å¯Ÿçã«ãã现ããªå¶åŸ¡ãå¿ èŠãªå Žåã
äŸïŒã¯ã©ã€ã¢ã³ãã䜿çšããŠS3ãã±ãããäžèŠ§è¡šç€ºãã
import boto3
# Create an S3 client
s3_client = boto3.client('s3')
# Call the list_buckets method
response = s3_client.list_buckets()
# Print out bucket names
print('Existing buckets:')
for bucket in response['Buckets']:
print(f' {bucket[\"Name\"]}')
ãã±ããåãååŸããããã«ã`response`èŸæžãããŒã¹ããå¿ èŠãããããšã«æ³šç®ããŠãã ããã
ãªãœãŒã¹APIïŒãªããžã§ã¯ãæåã®ã¢ãããŒã
ãªãœãŒã¹ã¯ãAWSãšå¯Ÿè©±ããããã®ãããPythonçããªæ¹æ³ãæäŸããŸãããããã¯ãåºç€ãšãªããããã¯ãŒã¯åŒã³åºãã®äžéšãé èœããããã¯ãªãŒã³ãªãªããžã§ã¯ãæåã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããŸãã
ãªãœãŒã¹ã䜿çšããå ŽåïŒ
- ããèªã¿ãããçŽæçãªã³ãŒãã®ããã«ã
- AWSãªããžã§ã¯ãã«å¯ŸããŠäžè¬çãªæäœãå®è¡ããå Žåã
- ãªããžã§ã¯ãæåããã°ã©ãã³ã°ã¹ã¿ã€ã«ã奜ãå Žåã
äŸïŒãªãœãŒã¹ã䜿çšããŠS3ãã±ãããäžèŠ§è¡šç€ºãã
import boto3
# Create an S3 resource
s3_resource = boto3.resource('s3')
# Iterate through all bucket objects
print('Existing buckets:')
for bucket in s3_resource.buckets.all():
print(f' {bucket.name}')
ãã®ã³ãŒãã¯ãééããªãããã¯ãªãŒã³ã§ãã`bucket`ãªããžã§ã¯ããçŽæ¥ã€ãã¬ãŒããã`.name`屿§ã䜿çšããŠãã®ååã«ã¢ã¯ã»ã¹ããŠããŸãã
ã¯ã©ã€ã¢ã³ã vs. ãªãœãŒã¹ïŒã©ã¡ããéžæãã¹ããïŒ
ããã«ã¯å¯äžã®æ£è§£ã¯ãªããã¿ã¹ã¯ãšå人ã®å¥œã¿ã«ãã£ãŠç°ãªãããšããããããŸããçµéšåãšããŠã以äžãæããããŸãã
- ãªãœãŒã¹ããå§ããïŒ äžè¬çãªã¿ã¹ã¯ã§ã¯ããªãœãŒã¹APIã䜿çšãããšãããèªã¿ãããä¿å®ããããã³ãŒãã«ãªããŸãã
- 匷åãªæ©èœãå¿ èŠãªå Žåã¯ã¯ã©ã€ã¢ã³ãã«åãæ¿ããïŒ ç¹å®ã®APIåŒã³åºãããªãœãŒã¹APIã§å©çšã§ããªãå Žåãããã©ã¡ãŒã¿ã®è©³çްãªå¶åŸ¡ãå¿ èŠãªå Žåã¯ãã¯ã©ã€ã¢ã³ãã䜿çšããŸãã
äž¡æ¹ãçµã¿åãããŠäœ¿ãããšãã§ããŸãããªãœãŒã¹ãªããžã§ã¯ãã¯ããã®åºç€ãšãªãã¯ã©ã€ã¢ã³ãã«`meta`屿§ïŒäŸïŒ`s3_resource.meta.client`ïŒãä»ããŠã¢ã¯ã»ã¹ã§ããŸãã
å®è·µçãªBoto3ã®æŽ»çšïŒäž»èŠAWSãµãŒãã¹ã®èªåå
äžçäžã®çµç¹ã§å©çšãããŠããæãäžè¬çãªAWSãµãŒãã¹ã®ããã€ããèªååããããšã§ãçè«ãå®è·µã«ç§»ããŠã¿ãŸãããã
Amazon S3 (Simple Storage Service)ïŒã°ããŒãã«ãªããŒã¿ãã
S3ã¯ãæ¥çããªãŒãããã¹ã±ãŒã©ããªãã£ãããŒã¿ã®å¯çšæ§ãã»ãã¥ãªãã£ãããã©ãŒãã³ã¹ãæäŸãããªããžã§ã¯ãã¹ãã¬ãŒãžãµãŒãã¹ã§ããå€ãã®å Žåãã¢ããªã±ãŒã·ã§ã³ã®ããŒã¿ã¹ãã¬ãŒãžã®åºç€ãšãªããŸãã
äŸïŒå®å šãªS3ã¯ãŒã¯ãããŒ
import boto3
import uuid # To generate a unique bucket name
# Use the S3 resource for a high-level interface
s3 = boto3.resource('s3')
# Choose a region where the bucket will be created
# Note: S3 bucket names must be globally unique!
region = 'us-east-1'
bucket_name = f'boto3-guide-unique-bucket-{uuid.uuid4()}'
file_name = 'hello.txt'
try:
# 1. Create a bucket
print(f'Creating bucket: {bucket_name}...')
s3.create_bucket(
Bucket=bucket_name,
CreateBucketConfiguration={'LocationConstraint': region}
)
print('Bucket created successfully.')
# 2. Upload a file
print(f'Uploading {file_name} to {bucket_name}...')
bucket = s3.Bucket(bucket_name)
bucket.put_object(Key=file_name, Body=b'Hello, World from Boto3!')
print('File uploaded successfully.')
# 3. List objects in the bucket
print(f'Listing objects in {bucket_name}:')
for obj in bucket.objects.all():
print(f' - {obj.key}')
# 4. Download the file
download_path = f'downloaded_{file_name}'
print(f'Downloading {file_name} to {download_path}...')
bucket.download_file(file_name, download_path)
print('File downloaded successfully.')
finally:
# 5. Clean up: Delete objects and then the bucket
print('Cleaning up resources...')
bucket = s3.Bucket(bucket_name)
# It's important to delete all objects before deleting the bucket
bucket.objects.all().delete()
bucket.delete()
print(f'Bucket {bucket_name} and its contents have been deleted.')
Amazon EC2 (Elastic Compute Cloud)ïŒä»®æ³ãµãŒããŒã®ç®¡ç
EC2ã¯ãã¯ã©ãŠãã§ã»ãã¥ã¢ãã€ãµã€ãºå€æŽå¯èœãªã³ã³ãã¥ãŒãã£ã³ã°å®¹éãæäŸããŸããéçºè ã«ãšã£ãŠãŠã§ãã¹ã±ãŒã«ãªã¯ã©ãŠãã³ã³ãã¥ãŒãã£ã³ã°ã容æã«ããããã«èšèšãããŠããŸãã
äŸïŒEC2ã€ã³ã¹ã¿ã³ã¹ã®èµ·åãšç®¡ç
import boto3
import time
# Use the EC2 resource
ec2 = boto3.resource('ec2', region_name='us-west-2')
# Find a suitable Amazon Linux 2 AMI in the specified region
# Using a client to get the latest AMI ID
ec2_client = boto3.client('ec2', region_name='us-west-2')
filters = [
{'Name': 'name', 'Values': ['amzn2-ami-hvm-*-x86_64-gp2']},
{'Name': 'state', 'Values': ['available']}
]
images = ec2_client.describe_images(Owners=['amazon'], Filters=filters)
ami_id = images['Images'][0]['ImageId']
print(f'Using AMI ID: {ami_id}')
# 1. Launch a new t2.micro instance (often in the free tier)
instance = ec2.create_instances(
ImageId=ami_id,
InstanceType='t2.micro',
MinCount=1,
MaxCount=1,
TagSpecifications=[
{
'ResourceType': 'instance',
'Tags': [{'Key': 'Name', 'Value': 'Boto3-Guide-Instance'}]
}
]
)[0] # create_instances returns a list
print(f'Instance {instance.id} is launching...')
# 2. Wait until the instance is in the 'running' state
instance.wait_until_running()
print(f'Instance {instance.id} is now running.')
# Reload the instance attributes to get the public IP address
instance.reload()
print(f'Public IP Address: {instance.public_ip_address}')
# 3. Stop the instance
print(f'Stopping instance {instance.id}...')
instance.stop()
instance.wait_until_stopped()
print(f'Instance {instance.id} is stopped.')
# 4. Terminate the instance (deletes it permanently)
print(f'Terminating instance {instance.id}...')
instance.terminate()
instance.wait_until_terminated()
print(f'Instance {instance.id} has been terminated.')
AWS LambdaïŒãµãŒããŒã¬ã¹çµ±å
Lambdaã¯ããµãŒããŒãããããžã§ãã³ã°ããã管çãããããããšãªãã³ãŒããå®è¡ã§ãããµãŒããŒã¬ã¹ã³ã³ãã¥ãŒãã£ã³ã°ãµãŒãã¹ã§ãã200以äžã®AWSãµãŒãã¹ããLambda颿°ãããªã¬ãŒããããä»»æã®ãŠã§ããŸãã¯ã¢ãã€ã«ã¢ããªããçŽæ¥åŒã³åºãããã§ããŸãã
äŸïŒLambda颿°ã®åŒã³åºã
ãŸããAWSã¢ã«ãŠã³ãã«Lambda颿°ãå¿
èŠã§ããJSONãã€ããŒããåãåãããããåŠçããŠçµæãè¿ã`my-data-processor`ãšããååã®ã·ã³ãã«ãªé¢æ°ããããšä»®å®ããŸãã
import boto3
import json
# Use the Lambda client
lambda_client = boto3.client('lambda', region_name='eu-central-1')
function_name = 'my-data-processor'
payload = {
'customer_id': '12345',
'transaction_amount': 99.99
}
try:
print(f'Invoking Lambda function: {function_name}')
response = lambda_client.invoke(
FunctionName=function_name,
InvocationType='RequestResponse', # Synchronous invocation
Payload=json.dumps(payload)
)
# The response payload is a streaming body, so we need to read and decode it
response_payload = json.loads(response['Payload'].read().decode('utf-8'))
print('Lambda invocation successful.')
print(f'Status Code: {response[\"StatusCode\"]}')
print(f'Response Payload: {response_payload}')
except lambda_client.exceptions.ResourceNotFoundException:
print(f'Error: Lambda function {function_name} not found.')
except Exception as e:
print(f'An error occurred: {e}')
å ç¢ãªã¢ããªã±ãŒã·ã§ã³ã®ããã®Boto3ã®é«åºŠãªæŠå¿µ
åºæ¬ã«æ £ããããBoto3ã®ããé«åºŠãªæ©èœã掻çšããŠãã¬ãžãªãšã³ãã§å¹ççãã€ã¹ã±ãŒã©ãã«ãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸãã
ãšã©ãŒãšäŸå€ã®åªé ãªåŠç
ãããã¯ãŒã¯ã®åé¡ãæš©éãšã©ãŒããŸãã¯ååšããªããªãœãŒã¹ãã¹ã¯ãªããã®å€±æãåŒãèµ·ããå¯èœæ§ããããŸããå ç¢ãªã³ãŒãã¯ãããã®ãšã©ãŒãäºæž¬ããåŠçããŸããBoto3ã¯ããµãŒãã¹åºæã®ãšã©ãŒïŒéåžžã`botocore.exceptions.ClientError`ã®ãµãã¯ã©ã¹ïŒã«å¯ŸããŠäŸå€ãçºçãããŸãã
ãããã®äŸå€ããã£ãããããšã©ãŒã³ãŒããæ€æ»ããŠç¹å®ã®åé¡ã倿ã§ããŸãã
import boto3
from botocore.exceptions import ClientError
s3_client = boto3.client('s3')
bucket_name = 'a-bucket-that-does-not-exist-12345'
try:
s3_client.head_bucket(Bucket=bucket_name)
print(f'Bucket \"{bucket_name}\" exists.')
except ClientError as e:
# Check for the specific '404 Not Found' error code
error_code = e.response['Error']['Code']
if error_code == '404':
print(f'Bucket \"{bucket_name}\" does not exist.')
elif error_code == '403':
print(f'Access denied. You do not have permission to access bucket \"{bucket_name}\".')
else:
print(f'An unexpected error occurred: {e}')
ãŠã§ã€ã¿ãŒïŒéåææäœã®åæ
EC2ã€ã³ã¹ã¿ã³ã¹ãS3ãã±ããã®äœæãªã©ãå€ãã®AWSæäœã¯éåæã§ããAPIåŒã³åºãã¯ããã«è¿ãããŸããããªãœãŒã¹ãç®çã®ç¶æ ã«éãããŸã§ã«ã¯æéãããããŸããè€éãªããŒãªã³ã°ã«ãŒããäœæãã代ããã«ãBoto3ã«çµã¿èŸŒãŸããŠããããŠã§ã€ã¿ãŒãã䜿çšã§ããŸãã
ãŠã§ã€ã¿ãŒã¯ããªãœãŒã¹ã®ã¹ããŒã¿ã¹ã宿çã«ããŒãªã³ã°ããç¹å®ã®ç¶æ ã«éãããã¿ã€ã ã¢ãŠãã«ãªããŸã§åŸ æ©ããŸãã
# This was already demonstrated in the EC2 example:
# Waiter for instance running
instance.wait_until_running()
# Waiter for S3 bucket to exist
s3_client = boto3.client('s3')
waiter = s3_client.get_waiter('bucket_exists')
waiter.wait(Bucket='my-newly-created-bucket')
print('Bucket is now ready to use.')
ããŒãžããŒã¿ãŒïŒå€§èŠæš¡ããŒã¿ã»ããã®å¹ççãªåŠç
S3ãã±ããå ã®ãã¹ãŠã®ãªããžã§ã¯ãããã¹ãŠã®IAMãŠãŒã¶ãŒããªã¹ã衚瀺ãããªã©ã倧éã®é ç®ãè¿ãå¯èœæ§ã®ããAPIåŒã³åºãã¯ãå€ãã®å ŽåããŒãžåå²ãããŸããããã¯ãçµæã®ãããŒãžããšæ¬¡ã®ããŒãžããªã¯ãšã¹ãããããã®ãããŒã¯ã³ããåãåãããšãæå³ããŸãããã®ããŒã¯ã³ãæåã§ç®¡çããã®ã¯é¢åãªå ŽåããããŸãã
ããŒãžããŒã¿ãŒã¯ãããŒã¯ã³ããžãã¯ãåŠçããããšã§ãã®ããã»ã¹ãç°¡çŽ åãããã¹ãŠã®çµæãã·ãŒã ã¬ã¹ã«å埩åŠçã§ããããã«ããŸãã
import boto3
s3_client = boto3.client('s3')
# Create a paginator
paginator = s3_client.get_paginator('list_objects_v2')
# Get an iterable object for all pages
pages = paginator.paginate(Bucket='a-very-large-bucket')
object_count = 0
for page in pages:
if 'Contents' in page:
for obj in page['Contents']:
# print(obj['Key'])
object_count += 1
print(f'Total objects found: {object_count}')
ã°ããŒãã«Boto3éçºã®ããã®ãã¹ããã©ã¯ãã£ã¹
æ©èœçãªã³ãŒããæžãããšãšãå®å šã§ä¿å®å¯èœãã€è²»çšå¯Ÿå¹æã®é«ãã³ãŒããæžãããšã¯å¥ç©ã§ããç¹ã«ã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã«åãçµãããŒã ã«ãšã£ãŠããã¹ããã©ã¯ãã£ã¹ãéµå®ããããšã¯éåžžã«éèŠã§ãã
ã»ãã¥ãªãã£
- èªèšŒæ å ±ãæ±ºããŠããŒãã³ãŒãããªãïŒ ããã¯äœåºŠåŒ·èª¿ããŠãè¶³ããŸãããEC2ãLambdaã®ãããªãµãŒãã¹ã«ã¯ãäžæçã§èªåçã«ããŒããŒã·ã§ã³ãããèªèšŒæ å ±ãæäŸããIAMããŒã«ã䜿çšããŠãã ãããããŒã«ã«éçºã«ã¯ãAWS CLIãä»ããŠèšå®ããã`~/.aws/credentials`ãã¡ã€ã«ã䜿çšããŸãã
- æå°æš©éã®ååãé©çšããïŒ ã¹ã¯ãªããã䜿çšããIAMãŠãŒã¶ãŒãŸãã¯ããŒã«ã¯ãå®è¡ããå¿ èŠãããã¢ã¯ã·ã§ã³ã®ã¿ã«å¯Ÿããæš©éãæã€ã¹ãã§ããäŸãã°ãS3ãã±ããããèªã¿åãã ãã®ã¹ã¯ãªããã¯ã`s3:PutObject`ã`s3:DeleteObject`ã®æš©éãæã€ã¹ãã§ã¯ãããŸããã
ããã©ãŒãã³ã¹
- ã¯ã©ã€ã¢ã³ã/ãªãœãŒã¹ãªããžã§ã¯ããåå©çšããïŒ Boto3ã¯ã©ã€ã¢ã³ããŸãã¯ãªãœãŒã¹ãªããžã§ã¯ãã®äœæã«ã¯ãããçšåºŠã®ãªãŒããŒãããã䌎ããŸããé·æéå®è¡ãããã¢ããªã±ãŒã·ã§ã³ãLambda颿°ã§ã¯ããªããžã§ã¯ããäžåºŠäœæããè€æ°ã®åŒã³åºãã§åå©çšããŸãã
- ãªãŒãžã§ã³éã®ã¬ã€ãã³ã·ãŒãçè§£ããïŒ å¯èœãªéããBoto3ã¹ã¯ãªããã¯ãæäœãããµãŒãã¹ãšåãAWSãªãŒãžã§ã³ã§å®è¡ããŠãã ãããäŸãã°ã`eu-west-1`ãªãŒãžã§ã³ã®EC2ã€ã³ã¹ã¿ã³ã¹äžã§ã³ãŒããå®è¡ããåã`eu-west-1`ãªãŒãžã§ã³å ã®ä»ã®ãªãœãŒã¹ã管çããŸããããã«ããããããã¯ãŒã¯ã¬ã€ãã³ã·ãŒãåçã«æžå°ããŸãã
ã³ãŒãå質ãšä¿å®æ§
- Boto3åŒã³åºããæœè±¡åããïŒ ã³ãŒãããŒã¹å šäœã«Boto3åŒã³åºããæ£ãã°ãããªãã§ãã ãããããããç¬èªã®é¢æ°ãã¯ã©ã¹ïŒäŸïŒ`S3Manager`ã¯ã©ã¹ïŒã§ã©ããããŸããããã«ãããã³ãŒãã®èªã¿ãããããã¹ããããããä¿å®æ§ãåäžããŸãã
- ãã®ã³ã°ã䜿çšããïŒ `print()`ã¹ããŒãã¡ã³ãã®ä»£ããã«ãPythonã®`logging`ã¢ãžã¥ãŒã«ã䜿çšããŸããããã«ãããåé·æ§ãå¶åŸ¡ããåºåããã¡ã€ã«ããã®ã³ã°ãµãŒãã¹ã«éä¿¡ã§ããŸããããã¯ãæ¬çªã¢ããªã±ãŒã·ã§ã³ã®ãããã°ã«äžå¯æ¬ ã§ãã
ã³ã¹ã管ç
- APIã³ã¹ãã«æ³šæããïŒ å€ãã®APIåŒã³åºãã¯ç¡æã§ãããç¹ã«å€§éã®`List`ã`Get`ãªã¯ãšã¹ããªã©ãäžéšã¯ã³ã¹ããçºçããå¯èœæ§ããããŸãã䜿çšãããµãŒãã¹ã®AWSæéã¢ãã«ã«æ³šæããŠãã ããã
- ãªãœãŒã¹ãã¯ãªãŒã³ã¢ããããïŒ éçºããã³ãã¹ãäžã«äœæããããªãœãŒã¹ã¯ãå¿ ãçµäºãŸãã¯åé€ããŠãã ãããäžèšã®EC2ããã³S3ã®äŸã«ã¯ã¯ãªãŒã³ã¢ããæé ãå«ãŸããŠããŸãããã¯ãªãŒã³ã¢ããã®èªååã¯ãBoto3èªäœã®åªãããŠãŒã¹ã±ãŒã¹ã§ãïŒ
çµè«ïŒã¯ã©ãŠããã¹ã¿ãŒãžã®é
Boto3ã¯åãªãã©ã€ãã©ãªã§ã¯ãããŸãããããã¯AWSãšã³ã·ã¹ãã å šäœãããã°ã©ã ã§å¶åŸ¡ããããã®ã²ãŒããŠã§ã€ã§ãããã®æ žãšãªãæŠå¿µãã€ãŸãã¯ã©ã€ã¢ã³ããšãªãœãŒã¹ããšã©ãŒåŠçããŠã§ã€ã¿ãŒãããŒãžããŒã¿ãŒãç¿åŸããããšã§ãã€ã³ãã©ã¹ãã©ã¯ãã£ãèªååããããŒã¿ã管çããã¢ããªã±ãŒã·ã§ã³ããããã€ããã»ãã¥ãªãã£ãå€§èŠæš¡ã«é©çšããèœåãè§£ãæŸã€ããšãã§ããŸãã
æ ã¯ããã§çµããã§ã¯ãããŸããããã®ã¬ã€ãã§èª¬æããååãšãã¿ãŒã³ã¯ãRDSã«ããããŒã¿ããŒã¹ç®¡çããSageMakerã«ããæ©æ¢°åŠç¿ãŸã§ãBoto3ããµããŒãããä»ã®äœçŸãã®AWSãµãŒãã¹ã«ãé©çšã§ããŸããåãµãŒãã¹ã®ç¹å®ã®æäœãæ¢çŽ¢ããã«ã¯ãå ¬åŒã®Boto3ããã¥ã¡ã³ããåªãããªãœãŒã¹ãšãªããŸãã
Boto3ãã¯ãŒã¯ãããŒã«çµ±åããããšã§ãããªãã¯Infrastructure as Codeã®å®è·µãåãå ¥ããäžçããªãŒãããã¯ã©ãŠããã©ãããã©ãŒã äžã§ãããå ç¢ã§ã¹ã±ãŒã©ãã«ãã€å¹ççãªãœãªã¥ãŒã·ã§ã³ãæ§ç¯ã§ããããã«ãªããŸããããããŒã³ãŒãã£ã³ã°ïŒ